﻿#define _CRT_SECURE_NO_WARNINGS
//exp1,exp2,exp3,...expN
//逗号表达式，就是用逗号隔开的多个表达式。
//逗号表达式，从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

//#include<stdio.h>
//
//int main()
//{   //代码1
//	int a = 1;
//	int b = 2;
//	int c = (a > b, a = b + 10, b = a + 1);//逗号表达式
//	//c是多少？
//
//	//代码2
//	if (a = b + 1, c = a / 2, d > 0)
//
//	//代码3
//	a = get_val();
//	count_val(a);
//	while (a > 0)
//	{
//		//业务处理
//		//...
//		a = get_val();
//		count_val(a);
//	}
//
//	如果使用逗号表达式，改为：
//		while (a = get_val(), count_val(a), a > 0)
//		{
//			//业务处理
//		}
//	return 0;
//}

////代码1
//int a = 1;
//int b = 2;
//int c = (a > b, a = b + 10, b = a + 1);//逗号表达式
////c是多少？
//
////代码2
//if (a = b + 1, c = a / 2, d > 0)
//
////代码3
//a = get_val();
//count_val(a);
//while (a > 0)
//{
//	//业务处理
//	//...
//	a = get_val();
//	count_val(a);
//}
//
//如果使用逗号表达式，改为：
//	while (a = get_val(), count_val(a), a > 0)
//	{
//		//业务处理
//	}


//8. 下标访问[]、函数调用()

//int arr[10];//创建数组
//arr[9] = 10;//使用下标引用操作符
//[ ]的两个操作数是 arr 和 9

//#include<stdio.h>
////
//void test1()
//{
//	printf("hehe\n");
//}
////
//void test2(const char* str)
//{
//	printf("%s\n", str);
//}
////
//int main()
//{
//	test1();//这里的()就是作为函数调用操作符
//	test2("hello bit");//这里的()也是作为函数调用操作符
//
//	return 0;
//}

//函数声明
//struct MyStruct
//{
//	member-list;
//}variable-list;
//
////描述一个学生
//struct Stu
//{
//	char name[20];//名字
//	int age;//年龄
//	char sex[2];//性别
//	char id[20];//学号
//};//分号不能丢

//结构体变量的定义和初始化

//代码1：变量的定义
//struct Point
//{
//	int x;
//	int y;
//}p1;            //声明类型的同时定义变量p1
//struct Point p2;//定义结构体变量p2
//
////代码2
//struct Point p3 = { 10, 20 };
//
//struct Stu
//{
//	char name[15];//名字
//	int age;//年龄
//};
//
//struct Stu s1 = { "yefan", 20 };//初始化
//struct Stu s2 = { .age = 20, .name = "shihao" };//指定顺序初始化
//
////代码3
//struct Node
//{
//	int date;
//	struct Point p;
//	struct Node* next;
//}n1 = { 10,{4,5},NULL };//结构体嵌套初始化
//
//struct Node n2 = { 20, {5,6}, NULL };//结构体嵌套初始化


//结构成员访问操作符

//结构直接访问：通过点操作符（.）访问的。点操作符接受两个操作数
// 
//#include<stdio.h>
//
//struct Point
//{
//	int x;
//	int y;
//}p = { 1,2 };
////
//int main()
//{
//	printf("x: %d y: %d\n", p.x, p.y);
//
//	return 0;
//}

//使用方式：结构体变量.成员名

//结构体的间接访问：
//有时候我们得到的不是一个结构体变量，而是一个指向结构体的指针

//#include<stdio.h>
//
//struct Point
//{
//	int x;
//	int y;
//};
//
//int main()
//{
//	struct Point p = { 3,4 };
//	struct Point* ptr = &p;
//
//	ptr->x = 10;
//	ptr->y = 20;
//	//
//	printf("x = %d y = %d\n", ptr->x, ptr->y);
//
//	return 0;
//}

//使用方式：结构体指针->成员名

//综合举例

#include<stdio.h>
#include<string.h>

//struct Stu
//{
//	char name[15];//名字
//	int age;//年龄
//};
////
//void print_stu(struct Stu s)
//{
//	printf("%s %d\n", s.name, s.age);
//}
////
//void set_stu(struct Stu* ps)
//{
//	strcpy(ps->name, "shihao");
//	ps->age = 25;
//}
////
//int main()
//{
//	struct Stu s = { "yefan", 20 };
//	//打印结构体
//	print_stu(s);
//	//置换
//	set_stu(&s);
//	//打印结构体
//	print_stu(s);
//
//	return 0;
//}

//优先级
//3 + 4 + 5；

//结合性
//5 * 6 / 2；

//11.整型提升:

////实例1
//char a, b, c;
//...
//a = b + c;
//
//
// b和c的值被称为普通整型，然后再执行加法运算
// 加法运算完成后，结果被截断，然后再储存a中
// 
//如何进行整型提升
//1.有符号整数提升是按照便令的数据类型的来提升的
//2.无符号整型提升，高位补0

////负数的整型提升
//char c1 = -1;
//变量c1 的二进制（补码）中只有8个比特位：
//11111111
//因为 char 为 有符号的 char
//所以整型提升的时候，高位补充符号位，即为1
//11111111111111111111111111111111
//
////正数的整型提升
//char c2 = 1;
//变量c2 的二进制（补码）中只有8个比特位：
//所以整型提升的时候，高位补充符号位，即为0
//00000000000000000000000000000001
//
////无符号整型提升，高位补0

//算术转换

//long double
//double
//float
//unsigned long int 
//long int
//unsigned int
//int


//问题表达式解析

//表达式1

////表达式求值部分由操作符的优先级决定。
////表达式1
//a* b + c * d + e * f

//
//顺序可能是：
//a * b
//c * d
//a * b + c * d
//e * f
//a * b + c * d + e * f

//也可能是
//a * b
//c * d
//e * f
//
//a * b + c * d
//a * b + c * d + e * f

//表达式2：
//c + --c;


//#include<stdio.h>
//
//int main()
//{
//	int c = 1;
//	//int a = c + --c;
//	int a =--c + c;
//	//
//	int b = 1;
//	
//	int d = b;
//	--b;
//	int e = d + b;
//
//	printf("a = %d\n", a);
//	printf("e = %d\n", e);
//
//	return 0;
//}

//表达式3
//#include<stdio.h>
//
//int main()
//{
//	int i = 1;
//
//	i = i-- - --i * (i = -3) * i++ + ++i;
//	printf("i = %d\n", i);//4
//
//	return 0;
//}


//表达式4

//#include<stdio.h>
//
//int fun()
//{
//	static int count = 1;
//	return ++count;
//}
// 
//int main()
//{
//	int answer;
//
//	answer = fun() - fun() * fun(); 
//
//	printf("%d\n", answer);
//
//	return 0;
//}

//代码5

//#include<stdio.h>
//
//int main()
//{
//	int i = 1;
//	int ret = (++i) + (++i) + (++i);
//	
//	printf("ret = %d\n", ret);//12
//	printf("i = %d\n", i);//4
//
//	return 0;
//}